/*===========================================================================

			    M P Q C T L. H
DESCRIPTION:

    This module contains QMI QCTL module.

INITIALIZATION AND SEQUENCING REQUIREMENTS:

Copyright (C) 2011 by Qualcomm Technologies, Incorporated.  All Rights Reserved.
===========================================================================*/

#ifndef MPQCTL_H
#define MPQCTL_H

#include "MPQMI.h"

#pragma pack(push, 1)

// ================= QMICTL ==================

// QMICTL Control Flags
#define QMICTL_CTL_FLAG_CMD 0x00
#define QMICTL_CTL_FLAG_RSP 0x01
#define QMICTL_CTL_FLAG_IND 0x02

#if 0
typedef struct _QMICTL_TRANSACTION_ITEM
{
   LIST_ENTRY  List;
   UCHAR       TransactionId;  // QMICTL transaction id
   PVOID       Context;        // Adapter or IocDev
   PIRP        Irp;
} QMICTL_TRANSACTION_ITEM, *PQMICTL_TRANSACTION_ITEM;
#endif

typedef struct _QCQMICTL_MSG_HDR {
    UCHAR CtlFlags;  // 00-cmd, 01-rsp, 10-ind
    UCHAR TransactionId;
    USHORT QMICTLType;
    USHORT Length;
} __attribute__((packed)) QCQMICTL_MSG_HDR, *PQCQMICTL_MSG_HDR;

#define QCQMICTL_MSG_HDR_SIZE sizeof(QCQMICTL_MSG_HDR)

typedef struct _QCQMICTL_MSG_HDR_RESP {
    UCHAR CtlFlags;  // 00-cmd, 01-rsp, 10-ind
    UCHAR TransactionId;
    USHORT QMICTLType;
    USHORT Length;
    UCHAR TLVType;	// 0x02 - result code
    USHORT TLVLength;	// 4
    USHORT QMUXResult;	// QMI_RESULT_SUCCESS
			// QMI_RESULT_FAILURE
    USHORT QMUXError;	// QMI_ERR_INVALID_ARG
			// QMI_ERR_NO_MEMORY
			// QMI_ERR_INTERNAL
			// QMI_ERR_FAULT
} __attribute__((packed)) QCQMICTL_MSG_HDR_RESP, *PQCQMICTL_MSG_HDR_RESP;

typedef struct _QCQMICTL_MSG {
    UCHAR CtlFlags;  // 00-cmd, 01-rsp, 10-ind
    UCHAR TransactionId;
    USHORT QMICTLType;
    USHORT Length;
    UCHAR Payload;
} __attribute__((packed)) QCQMICTL_MSG, *PQCQMICTL_MSG;

// TLV Header
typedef struct _QCQMICTL_TLV_HDR {
    UCHAR TLVType;
    USHORT TLVLength;
} __attribute__((packed)) QCQMICTL_TLV_HDR, *PQCQMICTL_TLV_HDR;

#define QCQMICTL_TLV_HDR_SIZE sizeof(QCQMICTL_TLV_HDR)

// QMICTL Type
#define QMICTL_SET_INSTANCE_ID_REQ 0x0020
#define QMICTL_SET_INSTANCE_ID_RESP 0x0020
#define QMICTL_GET_VERSION_REQ 0x0021
#define QMICTL_GET_VERSION_RESP 0x0021
#define QMICTL_GET_CLIENT_ID_REQ 0x0022
#define QMICTL_GET_CLIENT_ID_RESP 0x0022
#define QMICTL_RELEASE_CLIENT_ID_REQ 0x0023
#define QMICTL_RELEASE_CLIENT_ID_RESP 0x0023
#define QMICTL_REVOKE_CLIENT_ID_IND 0x0024
#define QMICTL_INVALID_CLIENT_ID_IND 0x0025
#define QMICTL_SET_DATA_FORMAT_REQ 0x0026
#define QMICTL_SET_DATA_FORMAT_RESP 0x0026
#define QMICTL_SYNC_REQ 0x0027
#define QMICTL_SYNC_RESP 0x0027
#define QMICTL_SYNC_IND 0x0027

#define QMICTL_FLAG_REQUEST 0x00
#define QMICTL_FLAG_RESPONSE 0x01
#define QMICTL_FLAG_INDICATION 0x02

// QMICTL Message Definitions

typedef struct _QMICTL_SET_INSTANCE_ID_REQ_MSG {
    UCHAR CtlFlags;  // QMICTL_FLAG_REQUEST
    UCHAR TransactionId;
    USHORT QMICTLType;	// QMICTL_SET_INSTANCE_ID_REQ
    USHORT Length;	// 4
    UCHAR TLVType;	// QCTLV_TYPE_REQUIRED_PARAMETER
    USHORT TLVLength;	// 1
    UCHAR Value;	// Host-unique QMI instance for this device driver
} __attribute__((packed)) QMICTL_SET_INSTANCE_ID_REQ_MSG,
    *PQMICTL_SET_INSTANCE_ID_REQ_MSG;

typedef struct _QMICTL_SET_INSTANCE_ID_RESP_MSG {
    UCHAR CtlFlags;  // QMICTL_FLAG_RESPONSE
    UCHAR TransactionId;
    USHORT QMICTLType;	// QMICTL_SET_INSTANCE_ID_RESP
    USHORT Length;
    UCHAR TLVType;     // QCTLV_TYPE_RESULT_CODE
    USHORT TLVLength;  // 0x0004
    USHORT QMIResult;
    USHORT QMIError;
    UCHAR TLV2Type;	// QCTLV_TYPE_REQUIRED_PARAMETER
    USHORT TLV2Length;	// 0x0002
    USHORT QMI_ID;	// Upper byte is assigned by MSM,
			// lower assigned by host
} __attribute__((packed)) QMICTL_SET_INSTANCE_ID_RESP_MSG,
    *PQMICTL_SET_INSTANCE_ID_RESP_MSG;

typedef struct _QMICTL_GET_VERSION_REQ_MSG {
    UCHAR CtlFlags;  // QMICTL_FLAG_REQUEST
    UCHAR TransactionId;
    USHORT QMICTLType;	// QMICTL_GET_VERSION_REQ
    USHORT Length;	// 0
    UCHAR TLVType;	// QCTLV_TYPE_REQUIRED_PARAMETER
    USHORT TLVLength;	// var
    UCHAR QMUXTypes;	// List of one byte QMUX_TYPE values
			// 0xFF returns a list of versions for all
			// QMUX_TYPEs implemented on the device
} __attribute__((packed)) QMICTL_GET_VERSION_REQ_MSG,
    *PQMICTL_GET_VERSION_REQ_MSG;

typedef struct _QMUX_TYPE_VERSION_STRUCT {
    UCHAR QMUXType;
    USHORT MajorVersion;
    USHORT MinorVersion;
} __attribute__((packed)) QMUX_TYPE_VERSION_STRUCT, *PQMUX_TYPE_VERSION_STRUCT;

typedef struct _ADDENDUM_VERSION_PREAMBLE {
    UCHAR LabelLength;
    UCHAR Label;
} __attribute__((packed)) ADDENDUM_VERSION_PREAMBLE,
    *PADDENDUM_VERSION_PREAMBLE;

#define QMICTL_GET_VERSION_RSP_TLV_TYPE_VERSION 0x01
#define QMICTL_GET_VERSION_RSP_TLV_TYPE_ADD_VERSION 0x10

typedef struct _QMICTL_GET_VERSION_RESP_MSG {
    UCHAR CtlFlags;  // QMICTL_FLAG_RESPONSE
    UCHAR TransactionId;
    USHORT QMICTLType;	// QMICTL_GET_VERSION_RESP
    USHORT Length;
    UCHAR TLVType;     // QCTLV_TYPE_RESULT_CODE
    USHORT TLVLength;  // 0x0004
    USHORT QMIResult;
    USHORT QMIError;
    UCHAR TLV2Type;	// QCTLV_TYPE_REQUIRED_PARAMETER
    USHORT TLV2Length;	// var
    UCHAR NumElements;	// Num of QMUX_TYPE_VERSION_STRUCT
    QMUX_TYPE_VERSION_STRUCT TypeVersion[0];
} __attribute__((packed)) QMICTL_GET_VERSION_RESP_MSG,
    *PQMICTL_GET_VERSION_RESP_MSG;

typedef struct _QMICTL_GET_CLIENT_ID_REQ_MSG {
    UCHAR CtlFlags;  // QMICTL_FLAG_REQUEST
    UCHAR TransactionId;
    USHORT QMICTLType;	// QMICTL_GET_CLIENT_ID_REQ
    USHORT Length;
    UCHAR TLVType;     // QCTLV_TYPE_REQUIRED_PARAMETER
    USHORT TLVLength;  // 1
    UCHAR QMIType;     // QMUX type
} __attribute__((packed)) QMICTL_GET_CLIENT_ID_REQ_MSG,
    *PQMICTL_GET_CLIENT_ID_REQ_MSG;

typedef struct _QMICTL_GET_CLIENT_ID_RESP_MSG {
    UCHAR CtlFlags;  // QMICTL_FLAG_RESPONSE
    UCHAR TransactionId;
    USHORT QMICTLType;	// QMICTL_GET_CLIENT_ID_RESP
    USHORT Length;
    UCHAR TLVType;	// QCTLV_TYPE_RESULT_CODE
    USHORT TLVLength;	// 0x0004
    USHORT QMIResult;	// result code
    USHORT QMIError;	// error code
    UCHAR TLV2Type;	// QCTLV_TYPE_REQUIRED_PARAMETER
    USHORT TLV2Length;	// 2
    UCHAR QMIType;
    UCHAR ClientId;
} __attribute__((packed)) QMICTL_GET_CLIENT_ID_RESP_MSG,
    *PQMICTL_GET_CLIENT_ID_RESP_MSG;

typedef struct _QMICTL_RELEASE_CLIENT_ID_REQ_MSG {
    UCHAR CtlFlags;  // QMICTL_FLAG_REQUEST
    UCHAR TransactionId;
    USHORT QMICTLType;	// QMICTL_RELEASE_CLIENT_ID_REQ
    USHORT Length;
    UCHAR TLVType;     // QCTLV_TYPE_REQUIRED_PARAMETER
    USHORT TLVLength;  // 0x0002
    UCHAR QMIType;
    UCHAR ClientId;
} __attribute__((packed)) QMICTL_RELEASE_CLIENT_ID_REQ_MSG,
    *PQMICTL_RELEASE_CLIENT_ID_REQ_MSG;

typedef struct _QMICTL_RELEASE_CLIENT_ID_RESP_MSG {
    UCHAR CtlFlags;  // QMICTL_FLAG_RESPONSE
    UCHAR TransactionId;
    USHORT QMICTLType;	// QMICTL_RELEASE_CLIENT_ID_RESP
    USHORT Length;
    UCHAR TLVType;	// QCTLV_TYPE_RESULT_CODE
    USHORT TLVLength;	// 0x0004
    USHORT QMIResult;	// result code
    USHORT QMIError;	// error code
    UCHAR TLV2Type;	// QCTLV_TYPE_REQUIRED_PARAMETER
    USHORT TLV2Length;	// 2
    UCHAR QMIType;
    UCHAR ClientId;
} __attribute__((packed)) QMICTL_RELEASE_CLIENT_ID_RESP_MSG,
    *PQMICTL_RELEASE_CLIENT_ID_RESP_MSG;

typedef struct _QMICTL_REVOKE_CLIENT_ID_IND_MSG {
    UCHAR CtlFlags;  // QMICTL_FLAG_INDICATION
    UCHAR TransactionId;
    USHORT QMICTLType;	// QMICTL_REVOKE_CLIENT_ID_IND
    USHORT Length;
    UCHAR TLVType;     // QCTLV_TYPE_REQUIRED_PARAMETER
    USHORT TLVLength;  // 0x0002
    UCHAR QMIType;
    UCHAR ClientId;
} __attribute__((packed)) QMICTL_REVOKE_CLIENT_ID_IND_MSG,
    *PQMICTL_REVOKE_CLIENT_ID_IND_MSG;

typedef struct _QMICTL_INVALID_CLIENT_ID_IND_MSG {
    UCHAR CtlFlags;  // QMICTL_FLAG_INDICATION
    UCHAR TransactionId;
    USHORT QMICTLType;	// QMICTL_REVOKE_CLIENT_ID_IND
    USHORT Length;
    UCHAR TLVType;     // QCTLV_TYPE_REQUIRED_PARAMETER
    USHORT TLVLength;  // 0x0002
    UCHAR QMIType;
    UCHAR ClientId;
} __attribute__((packed)) QMICTL_INVALID_CLIENT_ID_IND_MSG,
    *PQMICTL_INVALID_CLIENT_ID_IND_MSG;

typedef struct _QMICTL_SET_DATA_FORMAT_REQ_MSG {
    UCHAR CtlFlags;  // QMICTL_FLAG_REQUEST
    UCHAR TransactionId;
    USHORT QMICTLType;	// QMICTL_SET_DATA_FORMAT_REQ
    USHORT Length;
    UCHAR TLVType;     // QCTLV_TYPE_REQUIRED_PARAMETER
    USHORT TLVLength;  // 1
    UCHAR DataFormat;  // 0-default; 1-QoS hdr present
} __attribute__((packed)) QMICTL_SET_DATA_FORMAT_REQ_MSG,
    *PQMICTL_SET_DATA_FORMAT_REQ_MSG;

#ifdef QC_IP_MODE
#define SET_DATA_FORMAT_TLV_TYPE_LINK_PROTO 0x10
#define SET_DATA_FORMAT_LINK_PROTO_ETH 0x0001
#define SET_DATA_FORMAT_LINK_PROTO_IP 0x0002
typedef struct _QMICTL_SET_DATA_FORMAT_TLV_LINK_PROT {
    UCHAR TLVType;     // Link-Layer Protocol
    USHORT TLVLength;  // 2
    USHORT LinkProt;   // 0x1: ETH; 0x2: IP
} QMICTL_SET_DATA_FORMAT_TLV_LINK_PROT, *PQMICTL_SET_DATA_FORMAT_TLV_LINK_PROT;

#ifdef QCMP_UL_TLP
#define SET_DATA_FORMAT_TLV_TYPE_UL_TLP 0x11
typedef struct _QMICTL_SET_DATA_FORMAT_TLV_UL_TLP {
    UCHAR TLVType;	 // 0x11, Uplink TLP Setting
    USHORT TLVLength;	 // 1
    UCHAR UlTlpSetting;	 // 0x0: Disable; 0x01: Enable
} QMICTL_SET_DATA_FORMAT_TLV_UL_TLP, *PQMICTL_SET_DATA_FORMAT_TLV_UL_TLP;
#endif	// QCMP_UL_TLP

#ifdef QCMP_DL_TLP
#define SET_DATA_FORMAT_TLV_TYPE_DL_TLP 0x13
typedef struct _QMICTL_SET_DATA_FORMAT_TLV_DL_TLP {
    UCHAR TLVType;	 // 0x11, Uplink TLP Setting
    USHORT TLVLength;	 // 1
    UCHAR DlTlpSetting;	 // 0x0: Disable; 0x01: Enable
} QMICTL_SET_DATA_FORMAT_TLV_DL_TLP, *PQMICTL_SET_DATA_FORMAT_TLV_DL_TLP;
#endif	// QCMP_DL_TLP

#endif	// QC_IP_MODE

#ifdef MP_QCQOS_ENABLED
#define SET_DATA_FORMAT_TLV_TYPE_QOS_SETTING 0x12
typedef struct _QMICTL_SET_DATA_FORMAT_TLV_QOS_SETTING {
    UCHAR TLVType;     // 0x12, QoS setting
    USHORT TLVLength;  // 1
    UCHAR QosSetting;  // 0x0: Disable; 0x01: Enable
} QMICTL_SET_DATA_FORMAT_TLV_QOS_SETTING,
    *PQMICTL_SET_DATA_FORMAT_TLV_QOS_SETTING;
#endif	// MP_QCQOS_ENABLED

typedef struct _QMICTL_SET_DATA_FORMAT_RESP_MSG {
    UCHAR CtlFlags;  // QMICTL_FLAG_RESPONSE
    UCHAR TransactionId;
    USHORT QMICTLType;	// QMICTL_SET_DATA_FORMAT_RESP
    USHORT Length;
    UCHAR TLVType;     // QCTLV_TYPE_RESULT_CODE
    USHORT TLVLength;  // 0x0004
    USHORT QMIResult;  // result code
    USHORT QMIError;   // error code
} __attribute__((packed)) QMICTL_SET_DATA_FORMAT_RESP_MSG,
    *PQMICTL_SET_DATA_FORMAT_RESP_MSG;

typedef struct _QMICTL_SYNC_REQ_MSG {
    UCHAR CtlFlags;  // QMICTL_FLAG_REQUEST
    UCHAR TransactionId;
    USHORT QMICTLType;	// QMICTL_CTL_SYNC_REQ
    USHORT Length;	// 0
} __attribute__((packed)) QMICTL_SYNC_REQ_MSG, *PQMICTL_SYNC_REQ_MSG;

typedef struct _QMICTL_SYNC_RESP_MSG {
    UCHAR CtlFlags;  // QMICTL_FLAG_RESPONSE
    UCHAR TransactionId;
    USHORT QMICTLType;	// QMICTL_CTL_SYNC_RESP
    USHORT Length;
    UCHAR TLVType;     // QCTLV_TYPE_RESULT_CODE
    USHORT TLVLength;  // 0x0004
    USHORT QMIResult;
    USHORT QMIError;
} __attribute__((packed)) QMICTL_SYNC_RESP_MSG, *PQMICTL_SYNC_RESP_MSG;

typedef struct _QMICTL_SYNC_IND_MSG {
    UCHAR CtlFlags;  // QMICTL_FLAG_INDICATION
    UCHAR TransactionId;
    USHORT QMICTLType;	// QMICTL_REVOKE_CLIENT_ID_IND
    USHORT Length;
} __attribute__((packed)) QMICTL_SYNC_IND_MSG, *PQMICTL_SYNC_IND_MSG;

typedef struct _QMICTL_MSG {
    union {
	// Message Header
	QCQMICTL_MSG_HDR QMICTLMsgHdr;
	QCQMICTL_MSG_HDR_RESP QMICTLMsgHdrRsp;

	// QMICTL Message
	QMICTL_SET_INSTANCE_ID_REQ_MSG SetInstanceIdReq;
	QMICTL_SET_INSTANCE_ID_RESP_MSG SetInstanceIdRsp;
	QMICTL_GET_VERSION_REQ_MSG GetVersionReq;
	QMICTL_GET_VERSION_RESP_MSG GetVersionRsp;
	QMICTL_GET_CLIENT_ID_REQ_MSG GetClientIdReq;
	QMICTL_GET_CLIENT_ID_RESP_MSG GetClientIdRsp;
	QMICTL_RELEASE_CLIENT_ID_REQ_MSG ReleaseClientIdReq;
	QMICTL_RELEASE_CLIENT_ID_RESP_MSG ReleaseClientIdRsp;
	QMICTL_REVOKE_CLIENT_ID_IND_MSG RevokeClientIdInd;
	QMICTL_INVALID_CLIENT_ID_IND_MSG InvalidClientIdInd;
	QMICTL_SET_DATA_FORMAT_REQ_MSG SetDataFormatReq;
	QMICTL_SET_DATA_FORMAT_RESP_MSG SetDataFormatRsp;
	QMICTL_SYNC_REQ_MSG SyncReq;
	QMICTL_SYNC_RESP_MSG SyncRsp;
	QMICTL_SYNC_IND_MSG SyncInd;
    };
} __attribute__((packed)) QMICTL_MSG, *PQMICTL_MSG;

#endif	// MPQCTL_H
